import globals from 'globals';
import pluginJs from '@eslint/js';
import tseslint from 'typescript-eslint';
import pluginVue from 'eslint-plugin-vue';
import parserVue from 'vue-eslint-parser';
import pluginPrettierRecommendedConfigs from 'eslint-plugin-prettier/recommended';

import { FlatCompat } from '@eslint/eslintrc';
import { dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
globalThis.__filename = fileURLToPath(import.meta.url);
globalThis.__dirname = dirname(__filename);

const compat = new FlatCompat({
	baseDirectory: __dirname,
});

export default [
	{
		ignores: ['**/node_modules/', '.git/', '**/dist/', '**/.vscode/'],
	},
	...compat.config({
		extends: ['./.eslintrc-auto-import.json'],
	}),
	pluginJs.configs.recommended,
	...tseslint.configs.recommended,
	...pluginVue.configs['flat/essential'],
	// prettier 默认推荐规则
	pluginPrettierRecommendedConfigs,
	{
		languageOptions: {
			globals: {
				...globals.browser,
				...globals.es2020,
				...globals.node,
			},
			ecmaVersion: 2020,
			parser: parserVue,
			parserOptions: {
				parser: tseslint.parser,
				sourceType: 'module',
			},
		},
	},
	{
		// 可添加一些自定义规则
		rules: {
			'no-var': 'error',
			'no-unused-vars': 'off', // 关闭 ESLint 自带的 no-unused-vars 规则, 开启@typescript-eslint/no-unused-vars 规则，并可能添加配置以忽略类型定义
			'no-multiple-empty-lines': ['warn', { max: 1 }], // 不允许多个空行
			'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
			'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',

			'vue/require-default-prop': 0,
			// 组件 name 属性值必须使用帕斯卡命名法（单词首字母大写）
			'vue/name-property-casing': [0, 'PascalCase'],
			'vue/v-on-event-hyphenation': 'off', // html元素上事件函数名使用短横线连接
			'vue/no-mutating-props': 'warn', // props 参数应该不能直接修改
			'vue/multi-word-component-names': [
				0,
				{
					ignores: ['index'], //需要忽略的组件名
				},
			],
			eqeqeq: [2, 'always', { null: 'ignore' }],
			// 强制使用一致的反勾号、双引号或单引号
			quotes: [
				2,
				'single',
				{
					avoidEscape: true,
					allowTemplateLiterals: true,
				},
			],

			// typeScript (https://typescript-eslint.io/rules)
			'@typescript-eslint/no-unused-vars': [
				'error',
				{
					argsIgnorePattern: '^_',
					varsIgnorePattern: '^_',
				},
			], // 禁止定义未使用的变量
			'@typescript-eslint/ban-ts-comment': 'off',
			'@typescript-eslint/no-empty-function': 0,
			'@typescript-eslint/no-empty-interface': 0,
			'@typescript-eslint/ban-types': 'off',
			'@typescript-eslint/prefer-ts-expect-error': 'off', // 禁止使用 @ts-ignore
			'@typescript-eslint/no-explicit-any': 'off', // 禁止使用 any 类型
			'@typescript-eslint/no-var-requires': 'off',
			'@typescript-eslint/no-non-null-assertion': 'off',
			'@typescript-eslint/no-namespace': 'off', // 禁止使用自定义 TypeScript 模块和命名空间。
		},
	},
];
